package com.itheima.chap04;

public class CodeBlockBasicalKnowledge {
    // 1.类加载和初始化的顺序
    // 1.1静态成员变量的初始化
    public static int num = 100;

    // 2.对象创建的流程
    // 2.1普通成员变量的初始化
    public  int num2 = 10;

    // 2.3构造方法初始化
    public CodeBlockBasicalKnowledge() {
        System.out.println("空参构造方法...");
    }

    public void func(){
        System.out.println("num2 =  " + num2);
        System.out.println("普通方法...");
    }

    // 2.2构造代码块初始化
//    {
//        System.out.println("构造代码块...");
//    }

    {
        System.out.println("num2的初始值是： " + num2);
        num2++;
        System.out.println("构造代码块...");
    }
    // 结果：
       // num2的初始值是： 10
       //构造代码块...
       //空参构造方法...
       //普通方法...
    // 所以，同静态一样，它会先执行普通成员的赋值，再执行构造代码块
    // 其次再是构造方法->普通方法


    // 1.2静态代码块执行只在类加载和初始化时执行一次
//    static {
//        System.out.println("静态代码块...");
//    }


    static {
        System.out.println("num的初始值是：" + num);
        num++;
        System.out.println("静态代码块...");
        // 为判断num变量在堆内的赋值和静态代码块的编码是谁先执行所使用。如果静态代码块先执行，则num的初始值是0，如果变量的赋值先执行，则num的初始值是100
        // 结果：num的初始值是：100
            //静态代码块...
            //num = 101
            //num = 101
        // 所以应该是，先执行num的赋值，再执行静态代码块（只执行一次），再执行main方法

        // 所以，静态代码块的作用就是对静态成员变量做一个处理和加工
    }
}
